package main

import (
	"bytes"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"mime"
	"strings"
)

var (
	configPathFlag string
	//GlobalProxy       *Proxy
	//GlobalManager     *Manager
	//GlobalProxyInited = make(chan bool, 100)
)

func init() {
	flag.StringVar(&configPathFlag, "c", "", "conf file path")

	flag.Parse()

	//default
	if len(configPathFlag) == 0 {
		configPathFlag = "conf.conf"
	}
	config = NewConfig()
	config.LoadConf(configPathFlag)

	writeCode()
	initMime()
}

//func checkPid() {
//	tmpDir := os.TempDir()
//	pidPath := tmpDir + "\\my-gateway.pid"
//
//	str, err := ioutil.ReadFile(pidPath)
//	if err == nil {
//		//检查端口占用
//		if err := GlobalManager.start(); err != nil {
//			Kill(string(str))
//			//switch runtime.GOOS {
//			//case "darwin", "linux":
//			//	cmd := exec.Command("/bin/sh", "-c", "kill -9 "+string(str))
//			//	_ = cmd.Process.Kill()
//			//case "windows":
//			//	if pid, err := strconv.Atoi(string(str)); err == nil {
//			//		if h, err := syscall.OpenProcess(syscall.PROCESS_TERMINATE, false, uint32(pid)); err == nil {
//			//			_ = syscall.TerminateProcess(h, uint32(pid))
//			//		}
//			//	}
//			//}
//
//		}
//	}
//
//	//写入新PID
//	go func() {
//		pid := strconv.Itoa(os.Getpid())
//		_ = ioutil.WriteFile(pidPath, []byte(pid), 0666)
//	}()
//
//}

func writeCode() {
	fmt.Println("    ,---,.")
	fmt.Println("  ,'  .'  \\")
	fmt.Println(",---.' .' |")
	fmt.Println("|   |  |: |                                   .--.--.")
	fmt.Println(":   :  :  /   ,---.     ,---.     ,--.--.    /  /    '       .--,")
	fmt.Println(":   |    ;   /     \\   /     \\   /       \\  |  :  /`./     /_ ./|")
	fmt.Println("|   :     \\ /    /  | /    /  | .--.  .-. | |  :  ;_    , ' , ' :")
	fmt.Println("|   |   . |.    ' / |.    ' / |  \\__\\/: . .  \\  \\    `./___/ \\: |")
	fmt.Println("'   :  '; |'   ;   /|'   ;   /|  ,\" .--.; |   `----.   \\.  \\  ' |")
	fmt.Println("|   |  | ; '   |  / |'   |  / | /  /  ,.  |  /  /`--'  / \\  ;   :")
	fmt.Println("|   :   /  |   :    ||   :    |;  :   .'   \\'--'.     /   \\  \\  ;")
	fmt.Println("|   | ,'    \\   \\  /  \\   \\  / |  ,     .-./  `--'---'     :  \\  \\")
	fmt.Println("`----'       `----'    `----'   `--`---'                    \\  ' ;")
	fmt.Println("                                                             `--`")
}

func makeCode() {
	fmt.Print("")
	str, _ := ioutil.ReadFile("code.txt")
	strs := string(str)
	arr := strings.Split(strs, "\n")
	var buf bytes.Buffer
	for e := range arr {
		line := strings.ReplaceAll(arr[e], "\\", "\\\\")
		line = strings.ReplaceAll(line, "\r", "")
		line = strings.ReplaceAll(line, "\"", "\\\"")
		line = strings.ReplaceAll(line, "\n", "")
		buf.Write([]byte("fmt.Println(\"" + line + "\")"))
		buf.Write([]byte("\n"))
	}
	_ = ioutil.WriteFile("code2.txt", buf.Bytes(), 0644)
}

func initMime() {
	_ = mime.AddExtensionType(".json", "application/json; charset=utf-8")
}

type a struct {
	Bs string `json:"bs"`
}

func main() {
	chanExit := make(chan bool)
	go func() {
		err := StartManager()
		if err != nil {
			log.Printf("can not listen on port :%d", config.Listen)
			chanExit <- true
		}
	}()

	go func() {
		err := StartProxy()
		if err != nil {
			chanExit <- true
		}
	}()

	<-chanExit

}
